﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using FrbaCommerce.Comprar_Ofertar;

namespace FrbaCommerce.Comprar_Ofertar
{
    public partial class frm_publicaciones : Form
    {
        private DataTable dt_publicaciones;
        private int cantPags = 20;

        public frm_publicaciones()
        {
            InitializeComponent();
        }

        private void frm_publicaciones_Load(object sender, EventArgs e)
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_RUBROS";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt_visibilidades = baseDeDatos.consulta(sqlCommand);
            clb_rubros.DataSource = dt_visibilidades;
            clb_rubros.DisplayMember = "DESCRIPCION";
            clb_rubros.ValueMember = "ID_RUBRO";

            ll_primeraPagina.Enabled = false;
            ll_retroceder.Enabled = false;
            ll_avanzar.Enabled = false;
            ll_ultimaPagina.Enabled = false;
            btn_ver.Enabled = false;
        }

        private void btn_limpiar_Click(object sender, EventArgs e)
        {
            gb_filtrosBusqueda.Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Text = String.Empty);
            for (int i = 0; i < clb_rubros.Items.Count; i++)
                clb_rubros.SetItemChecked(i, false);
        }

        private void btn_buscar_Click(object sender, EventArgs e)
        {
            lbl_nroPagina.Text = "1";
            cargar_dt_publicaciones();
        }

        private void cargar_dt_publicaciones()
        {
            string filtroDescripcion = "";
            string filtroRubros = "";
            if (txt_descripPublicacion.Text != "")
                filtroDescripcion = "AND P.DESCRIPCION LIKE '%" + txt_descripPublicacion.Text + "%' ";
            string idRubros = this.crearStringIdRubros();
            if (idRubros != "")
                filtroRubros = "AND RP.ID_RUBRO IN (" + idRubros + ") ";
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();

            sqlCommand.CommandText =  "SELECT DISTINCT P.ID_PUBLICACION, P.ID_TIPO_PUBLICACION, P.ID_USUARIO, P.ID_ROL, P.ID_ESTADO, P.ID_VISIBILIDAD, " +
                                      "TP.DESCRIPCION AS 'TIPO_PUBLICACION', P.COD_PUBLICACION, P.DESCRIPCION, P.PRECIO, P.STOCK, P.FECHA_INICIO, P.FECHA_VENCIMIENTO, " +
                                      "E.DESCRIPCION AS 'ESTADO', V.DESCRIPCION AS 'VISIBILIDAD', U.USERNAME AS 'USUARIO',V.PRECIO_POR_PUBLICAR " +
                                      "FROM LOS_GDDES.PUBLICACIONES P " +
                                      "INNER JOIN LOS_GDDES.RUBROS_X_PUBLICACIONES RP ON RP.ID_PUBLICACION = P.ID_PUBLICACION " +
                                      "INNER JOIN LOS_GDDES.ROLES_X_USUARIOS RU ON RU.ID_USUARIO = P.ID_USUARIO AND RU.ID_ROL = P.ID_ROL " +
                                      "INNER JOIN LOS_GDDES.USUARIOS U ON U.ID_USUARIO = RU.ID_USUARIO " +
                                      "INNER JOIN LOS_GDDES.ESTADOS E ON E.ID_ESTADO = P.ID_ESTADO " +
                                      "INNER JOIN LOS_GDDES.TIPOS_PUBLICACION TP ON P.ID_TIPO_PUBLICACION = TP.ID_TIPO_PUBLICACION " +
                                      "INNER JOIN LOS_GDDES.VISIBILIDADES V ON V.ID_VISIBILIDAD = P.ID_VISIBILIDAD " +
                                      "WHERE ((E.DESCRIPCION = 'Activa') OR (E.DESCRIPCION = 'Pausada')) " +
                                      "AND P.FECHA_VENCIMIENTO > " + "@fechaDeSistema " +
                                      filtroDescripcion + filtroRubros +
                                      "ORDER BY V.PRECIO_POR_PUBLICAR DESC";
            sqlCommand.CommandType = CommandType.Text;
            sqlCommand.Parameters.AddWithValue("@fechaDeSistema", Convert.ToDateTime(Properties.Settings.Default.FechaDelSistema));
            dt_publicaciones = baseDeDatos.consulta(sqlCommand);

            this.mostrarFilas();
            ll_primeraPagina.Enabled = true;
            ll_retroceder.Enabled = true;
            ll_avanzar.Enabled = true;
            ll_ultimaPagina.Enabled = true;
        }

        private void mostrarFilas()
        {
            if (dt_publicaciones.Rows.Count <= cantPags)
            {
                dgv_publicaciones.DataSource = dt_publicaciones;
            }
            else
            {
                int limiteInf = (Convert.ToInt32(lbl_nroPagina.Text) - 1) * cantPags;
                int limiteSup = limiteInf + cantPags;

                DataTable dt_publicacionesTemp = dt_publicaciones.Clone();

                for (int i = limiteInf; i < limiteSup; i++)
                {
                    if (i < dt_publicaciones.Rows.Count)
                        dt_publicacionesTemp.ImportRow(dt_publicaciones.Rows[i]);
                }

                dgv_publicaciones.DataSource = dt_publicacionesTemp;
            }

            dgv_publicaciones.Columns[0].Visible = false;
            dgv_publicaciones.Columns[1].Visible = false;
            dgv_publicaciones.Columns[2].Visible = false;
            dgv_publicaciones.Columns[3].Visible = false;
            dgv_publicaciones.Columns[4].Visible = false;
            dgv_publicaciones.Columns[5].Visible = false;
            dgv_publicaciones.Columns[16].Visible = false;
        }

        private string crearStringIdRubros()
        {
            string idRubros = "";
            foreach(DataRowView drv_rubro in clb_rubros.CheckedItems)
                if(idRubros == "")
                    idRubros = Convert.ToString(drv_rubro.Row.Field<Decimal>("ID_RUBRO"));
                else
                    idRubros = idRubros + "," + Convert.ToString(drv_rubro.Row.Field<Decimal>("ID_RUBRO"));

            return idRubros;
        }

        private void ll_retroceder_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (Convert.ToInt32(lbl_nroPagina.Text) > 1)
            {
                lbl_nroPagina.Text = (Convert.ToInt32(lbl_nroPagina.Text) - 1).ToString();
                this.mostrarFilas();
            }
        }

        private void ll_avanzar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if ((Convert.ToInt32(lbl_nroPagina.Text) * cantPags) < dt_publicaciones.Rows.Count)
            {
                lbl_nroPagina.Text = (Convert.ToInt32(lbl_nroPagina.Text) + 1).ToString();
                this.mostrarFilas();
            }
        }

        private void ll_primeraPagina_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            lbl_nroPagina.Text = "1";
            this.mostrarFilas();
        }

        private void ll_ultimaPagina_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (dt_publicaciones.Rows.Count > 0)
            {
                int ultimaPag = dt_publicaciones.Rows.Count / cantPags;
                if ((dt_publicaciones.Rows.Count % cantPags) != 0)
                    ultimaPag += 1;
                lbl_nroPagina.Text = ultimaPag.ToString();
                this.mostrarFilas();
            }
        }

        private void dgv_publicaciones_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            btn_ver.Enabled = true;       
        }

        private static void validar_stock_valido(int id_publicacion)
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.VALIDAR_STOCK_NO_0";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.AddWithValue("@id_publicacion", id_publicacion);
            baseDeDatos.ejecuta(sqlCommand);
        }

        private void btn_ver_Click(object sender, EventArgs e)
        {       
            if (dgv_publicaciones.CurrentRow != null)
            {
                DataRow dr_publicacion = (dgv_publicaciones.CurrentRow.DataBoundItem as DataRowView).Row;

                if (dr_publicacion.Field<Decimal>("STOCK") == 0)
                {
                    validar_stock_valido(Convert.ToInt32(dr_publicacion.Field<Decimal>("ID_PUBLICACION")));
                    MessageBox.Show("Disculpe, parece que hay una inconsistencia de datos del sistema anterior. " +
                                    "Esta publicación no tiene stock y debería estar finalizada. Actualizaremos esta información en nuestro sistema.");
                    //cargar_dt_publicaciones();
                }
                else
                {
                    if (dr_publicacion.Field<Decimal>("ID_TIPO_PUBLICACION") == 1) //Compra Inmediata
                    {
                        frm_compraInmediata frm_compraInmediata = new frm_compraInmediata(dr_publicacion);
                        frm_compraInmediata.ShowDialog();
                        this.btn_buscar_Click(sender, e);
                    }
                    if (dr_publicacion.Field<Decimal>("ID_TIPO_PUBLICACION") == 2) //Subasta
                    {
                        frm_subasta frm_subasta = new frm_subasta(dr_publicacion);
                        frm_subasta.ShowDialog();
                        this.btn_buscar_Click(sender, e);
                    }
                }
            }
        }

        private void btn_cerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        } 
    }
}